/*  --------------------------- (C) COPYRIGHT 2020 Fortiortech ShenZhen -----------------------------
    File Name      : MotorControl.c
    Author         : Fortiortech  Appliction Team
    Version        : V1.0
    Date           : 2020-04-10
    Description    : This file contains .C file function used for Motor Control.
    ----------------------------------------------------------------------------------------------------
                                       All Rights Reserved
    ------------------------------------------------------------------------------------------------- */
#include <MyProject.h>

/*  -------------------------------------------------------------------------------------------------
    Function Name  : FaultProcess
    Description    : 错误处理函数
    Date           : 2020-04-10
    Parameter      : None
    ------------------------------------------------------------------------------------------------- */
void FaultProcess(void)
{
    MOE = 0;
    BLDC.BLDCSetFlag = 0;
    ClrBit(DRV_CR, DRVEN);
    mcState = mcFault;
}

/*  -------------------------------------------------------------------------------------------------
    Function Name  : Fault_OverUnderVoltage
    Description    : 过压欠压保护函数：程序每5ms判断一次，母线电压大于过压保护值时，计数器加一，计数器值超过20次，判断为过压保护，关闭输出;反之，计数器慢慢减
                     同理，欠压保护。
                     电机过欠压保护状态下，母线电压恢复到欠压恢复值以上，过压恢复值以下时，计数器加一，超过200次后，恢复。根据档位信息来决定恢复到哪个状态。
                     电压电路检测故障  检测到的系统电压小于5v大于40v 认为电压检测故障

    Date           : 2020-04-10
    Parameter      : h_Fault: [输入/出]
    ------------------------------------------------------------------------------------------------- */
void Fault_OverUnderVoltage(void)
{
  
    /*********下面部分检测过压欠压保护*********/
	
    /************过压保护*********/
    /* 输入的端电压高于 16.3V 时， 持续超过 400ms 后， 记为过电压故障*/
    if (mcFocCtrl.mcDcbusFlt > OVER_PROTECT_VALUE) //母线电压大于过压保护值时，计数，超过20次，判断为过压保护，关闭输出;反之，计数器慢慢减
    {
        mcFaultDect.OverVoltDetecCnt++;
        
        if (mcFaultDect.OverVoltDetecCnt > Over_Voltage_Time)
        {
            mcFaultDect.OverVoltDetecCnt = 0;
            mcFaultSource = FaultOverVoltage;
            mcState = mcFault;
        }
    }
    else if (mcFaultDect.OverVoltDetecCnt > 0)
    {
        mcFaultDect.OverVoltDetecCnt--;
    }
    
    /*********欠压保护*********/
    /* 输入的端电压低于 8.5V 时， 持续超过 700ms 后， 记为低电压故障*/
    if (mcFocCtrl.mcDcbusFlt < UNDER_PROTECT_VALUE)
    {
        mcFaultDect.UnderVoltDetecCnt++;
        
        if (mcFaultDect.UnderVoltDetecCnt > Under_Vlotage_Time)
        {
            mcFaultDect.UnderVoltDetecCnt = 0;
            mcFaultSource = FaultUnderVoltage;
            mcState = mcFault;
        }
    }
    else if (mcFaultDect.UnderVoltDetecCnt > 0)
    {
        mcFaultDect.UnderVoltDetecCnt--;
    }
    
    /*******过压欠压保护恢复*********/
    
    if ((mcFocCtrl.mcDcbusFlt < OVER_RECOVER_VALUE) && (mcFocCtrl.mcDcbusFlt > UNDER_RECOVER_VALUE))
    {
        mcFaultDect.VoltRecoverCnt++;
        
        if (mcFaultDect.VoltRecoverCnt > Voltage_Recover_Time) //连续检测2000ms，若正常则恢复
        {
            mcFaultSource = FaultNoSource;
            mcFaultDect.VoltRecoverCnt = 0;
        }
    }
    else
    {
        mcFaultDect.VoltRecoverCnt = 0;
    }
}

/*  -------------------------------------------------------------------------------------------------
    Function Name  : Fault_Overcurrent 软件过流保护
    Description    :
    Date           : 2020-04-10
    Parameter      : h_Cur: [输入/出]
    ------------------------------------------------------------------------------------------------- */
unsigned int OverSoftCurrentValue_test;
void Fault_Overcurrent(void)
{
    if (mcFocCtrl.mcIbusFlt >= OverSoftCurrentValue)
    {
        OverSoftCurrentValue_test = OverSoftCurrentValue;
        mcFaultDect.OverCurrentCnt++;
        
        if (mcFaultDect.OverCurrentCnt >= OverSoftCurrentTime)
        {
            mcFaultDect.OverCurrentCnt = 0;
            //  mcFaultSource = FaultSoftOVCurrent;
            //  FaultProcess();
            //  mcState = mcFault;
        }
    }
    else
    {
        if (mcFaultDect.OverCurrentCnt > 0)
        {
            mcFaultDect.OverCurrentCnt--;
        }
    }
}
/*  -------------------------------------------------------------------------------------------------
    Function Name  : Fault_OverTemp
    Description    : 驱动电机温度 检测，检测电机温度和温度检测电路是否故障
    Date           : 2021-03-19
    Parameter      : h_Fault: [输入/出]
    ------------------------------------------------------------------------------------------------- */
void Fault_OverTemp(void)
{
    /*******温度检测传感器故障，包括传感器短路和开路*********/

}
/*  -------------------------------------------------------------------------------------------------
    Function Name  : Fault_Stall
    Description    : 堵转保护函数
                     使用PDIF中断的标志位，若是启动该中断，则堵转保护出错
    Date           : 2021-03-19
    Parameter      : h_Fault: [输入/出]
    ------------------------------------------------------------------------------------------------- */
uint16 BCCR_test = 0;
uint16 BCOR_test = 0;
uint16 MINB_SET = 0;
uint16 MAXB_SET = 0;
void Fault_Stall(void)
{
    static uint16 timecont = 0;
    
    if (BLDC.BLDCSetFlag == 2)
    {
        timecont++;
    }
    else
    {
        timecont = 0;
    }
    
    /*启动300ms后速度低于1800，判定堵转*/
//    if ((BLDC.BLDCSetFlag == 2) &&
//        (TIM1_BCOR > Motor_Stall_Speed_MIN) &&  /*TIM1_BCOR>最小切换时间*/
//        (TIM1__BCCR > Motor_Stall_Speed_MIN) && /*TIM1_BCOR>最小切换时间*/
//        (timecont >= (MOTOR_STALL_COUNT * 3))   /*加速启动时间300ms*/
//    )
//    {
//        mcFaultDect.Stall_flag = 1;
//    }
    
    /*振动型堵转保护，堵转失步速度*/
//    if ((((TIM1_BCOR < Motor_Stall_Speed_BCOR) && (TIM1_BCOR > 0) &&
//                (TIM1__BCCR < Motor_Stall_Speed_BCOR) && (TIM1__BCCR > 0)) ||
//            (mcFaultDect.Stall_COUNT == MOTOR_STALL_COUNT)) &&
//        (BL_S.BLDCSetFlag == 2))
//    {
//        // AGS_DATA.FaultMechanicalBreak = 1; //空转失步 速度要实际计算
//    }
    
    /*  静止堵转保护
        if (BL_S.BLDCSetFlag == 2)
        {
        if (ReadBit(TIM1_SR, T1WTIF))
        {
    
            mcFaultDect.Stall_COUNT = 0;
            ClrBit(TIM1_SR, T1WTIF);
        }
        else if (mcFaultDect.Stall_COUNT < MOTOR_STALL_COUNT)
        {
    
            mcFaultDect.Stall_COUNT++;
        }
        }*/
}

/*  -------------------------------------------------------------------------------------------------
    Function Name  : Fault_Circuit
    Description    : 电路检测保护函数 检测
    Date           : 2021-03-19
    Parameter      : h_Fault: [输入/出]
    ------------------------------------------------------------------------------------------------- */
void Fault_Circuit(void)
{
}
/*  -------------------------------------------------------------------------------------------------
    Function Name  : Fault_Start
    Description    : 启动保护函数
                     长时间位于启动状态，没有切换到硬件运行则认为启动失败
    Date           : 2021-03-19
    Parameter      : h_Fault: [输入/出]
    ------------------------------------------------------------------------------------------------- */
void Fault_Start(void)
{
//    if ((BL_S.BLDCSetFlag == 1) && (BL_S.Commutation_Count == 0))
//    {
//        FaultProcess();
//        mcState = mcFault;
//        mcFaultSource = FaultStart;
//    }
}



/*  -------------------------------------------------------------------------------------------------
    Function Name  : Fault_Detection
    Description    : 保护函数，因保护的时间响应不会很高，采用分段处理，每5个定时器中断执行一次对应的保护
                     常见保护有过欠压、过温、堵转、启动、缺相等保护，调试时，可根据需求，一个个的调试加入。
    Date           : 2020-04-10
    Parameter      : None
    ------------------------------------------------------------------------------------------------- */
void Fault_Detection(void)
{
    if (VoltageProtectEnable == 1) //过压保护使能
    {
        Fault_OverUnderVoltage();
    }
    
    if (OSCurrentProtectEnable == 1) //软件过流保护
    {
        Fault_Overcurrent();
    }
}
